home *** CD-ROM | disk | FTP | other *** search
- "
- control the values produced by a generator
- "
- Class ControlGenerator :Generator
- | firstGenerator secondGenerator
- currentFirst currentSecond
- controlBlock computeBlock |
- [
- initA: fGen b: sGen control: aBlock compute: anotherBlock
- firstGenerator <- fGen.
- secondGenerator <- sGen.
- controlBlock <- aBlock.
- computeBlock <- anotherBlock
-
- | first
- currentFirst <- firstGenerator first.
- currentSecond <- secondGenerator first.
- (currentFirst isNil & currentSecond isNil) ifTrue: [^ nil].
- ^ self controlGeneratorNext
-
- | next
- ^ self controlGeneratorNext
-
- | controlGeneratorNext | control returnedValue |
- control <- 0.
- [ control anyMask: 12] whileFalse: [
- control <- controlBlock value: currentFirst
- value: currentSecond.
- (control allMask: 64) ifTrue: [^nil].
- (control allMask: 32) ifTrue:
- [currentFirst <- firstGenerator first].
- (control allMask: 16) ifTrue:
- [currentSecond <- secondGenerator first].
- (control allMask: 12)
- ifTrue:
- [returnedValue <- computeBlock
- value: currentFirst value: currentSecond]
- ifFalse: [
- (control allMask: 8) ifTrue:
- [returnedValue <- computeBlock value: currentFirst].
- (control allMask: 4) ifTrue:
- [returnedValue <- computeBlock value: currentSecond].
- ].
- (control allMask: 2) ifTrue:
- [currentFirst <- firstGenerator next].
- (control allMask: 1) ifTrue:
- [currentSecond <- secondGenerator next].
- ].
- ^ returnedValue
- ]